#include <bits/stdc++.h>
#define ll long long
using namespace std;
struct control
{
    int ct, val;
    control(int Ct, int Val = -1)
        : ct(Ct), val(Val)
    {
    }
    inline control operator()(int Val)
    {
        return control(ct, Val);
    }
} _endl(0), _prs(1), _setprecision(2);
struct FastIO
{
#define IOSIZE 1000000
    char in[IOSIZE], *p, *pp, out[IOSIZE], *q, *qq, ch[20], *t, b, K, prs;
    FastIO()
        : p(in), pp(in), q(out), qq(out + IOSIZE), t(ch), b(1), K(6)
    {
    }
    ~FastIO()
    {
        flush();
    }
    void flush()
    {
        fwrite(out, 1, q - out, stdout);
        q = out;
    }
    inline char getch()
    {
        return p == pp && (pp = (p = in) + fread(in, 1, IOSIZE, stdin), p == pp) ? b = 0, EOF : *p++;
    }
    inline void putch(char x)
    {
        q == qq && (fwrite(out, 1, q - out, stdout), q = out), *q++ = x;
    }
    inline void puts(const char str[])
    {
        fwrite(out, 1, q - out, stdout), fwrite(str, 1, strlen(str), stdout), q = out;
    }
    inline void getline(std::string &s)
    {
        s = "";
        for (char ch; (ch = getch()) != '\n' && b;)
            s += ch;
    }
#define indef(T)                                               \
    inline FastIO &operator>>(T &x)                            \
    {                                                          \
        x = 0;                                                 \
        char f = 0, ch;                                        \
        while (!isdigit(ch = getch()) && b)                    \
            f |= ch == '-';                                    \
        while (isdigit(ch))                                    \
            x = (x << 1) + (x << 3) + (ch ^ 48), ch = getch(); \
        return x = f ? -x : x, *this;                          \
    }
    indef(int) indef(long long) inline FastIO &operator>>(char &ch)
    {
        return ch = getch(), *this;
    }
    inline FastIO &operator>>(std::string &s)
    {
        s = "";
        char ch;
        while (isspace(ch = getch()) && b)
            ;
        while (!isspace(ch) && b)
            s += ch, ch = getch();
        return *this;
    }
    inline FastIO &operator>>(double &x)
    {
        x = 0;
        char f = 0, ch;
        double d = 0.1;
        while (!isdigit(ch = getch()) && b)
            f |= (ch == '-');
        while (isdigit(ch))
            x = x * 10 + (ch ^ 48), ch = getch();
        if (ch == '.')
            while (isdigit(ch = getch()))
                x += d * (ch ^ 48), d *= 0.1;
        return x = f ? -x : x, *this;
    }
#define outdef(_T)                                            \
    inline FastIO &operator<<(_T x)                           \
    {                                                         \
        !x && (putch('0'), 0), x < 0 && (putch('-'), x = -x); \
        while (x)                                             \
            *t++ = x % 10 + 48, x /= 10;                      \
        while (t != ch)                                       \
            putch(*--t);                                      \
        return *this;                                         \
    }
    outdef(int) outdef(long long) inline FastIO &operator<<(char ch)
    {
        return putch(ch), *this;
    }
    inline FastIO &operator<<(const char str[])
    {
        return puts(str), *this;
    }
    inline FastIO &operator<<(const std::string &s)
    {
        return puts(s.c_str()), *this;
    }
    inline FastIO &operator<<(double x)
    {
        int k = 0;
        this->operator<<(int(x));
        putch('.');
        x -= int(x);
        prs && (x += 5 * pow(10, -K - 1));
        while (k < K)
            putch(int(x *= 10) ^ 48), x -= int(x), ++k;
        return *this;
    }
    inline FastIO &operator<<(const control &cl)
    {
        switch (cl.ct)
        {
        case 0:
            putch('\n');
            break;
        case 1:
            prs = cl.val;
            break;
        case 2:
            K = cl.val;
            break;
        }
        return *this;
    }
    inline operator bool()
    {
        return b;
    }
} io;
// #define test
#define cin io
#define cout io
// 一条路线合法当且仅当其为后序遍历，其中左右儿子的顺序可任意调换
// 猜测满足最小值需要在整棵树中遍历时记录最小深度
const int MAX = 131071;
int n;
int p[MAX], v[MAX];
int l[MAX], r[MAX];
ll d[MAX], ans; // 该点的叶节点的最小深度
inline ll mmin(ll x, ll y)
{
    return x < y ? x : y;
}
inline ll mmax(ll x, ll y)
{
    return x > y ? x : y;
}
void dp(int lc)
{
    d[lc] = INT64_MAX;
    if (l[lc])
    {
        dp(l[lc]);
        dp(r[lc]);
        d[lc] = mmin(d[lc], d[l[lc]] + v[l[lc]]);
        d[lc] = mmin(d[lc], d[r[lc]] + v[r[lc]]);
        ans = mmax(ans, d[l[lc]] + v[l[lc]] + d[r[lc]] + v[r[lc]]);
    }
    else
        d[lc] = 0; // 当前节点为叶节点
}
int main()
{
    // ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
#ifdef test
    freopen("/home/hp/桌面/problems/contest/noip2025模拟赛/2025.10.26/down/data/trip/trip4/trip1.in", "r", stdin);
#else
    freopen("trip.in", "r", stdin);
    freopen("trip.out", "w", stdout);
#endif
    cin >> n;
    for (int i = 2; i <= n; i++)
    {
        cin >> p[i] >> v[i];
        if (l[p[i]])
            r[p[i]] = i;
        else
            l[p[i]] = i;
    }
    dp(1);
    cout << ans;
}